// 未完成--尚硅谷的promise教程封装部分实在是不懂，以后再看
function Promise( executor){
    // 添加属性
    this.PromiseState = 'pending';
    this.PromiseResult = null;
    // 声明一个属性
    this.callbacks = [];
    // 保存实例对象的this的值
    const _this = this;
    // resolve函数
    function resolve(data){
        // 判断状态
        if(_this.PromiseState !== 'pending') return;
        // 1.修改状态 promiseState
        _this.PromiseState = 'fufilled';
        // 2.设置对象的值 promiseResult
        _this.PromiseResult = data;
        // 调用成功的回调
        _this.callbacks.forEach(item=>{
            item.onResolved(data)
        })
    }
    // reject 函数
    function reject(data){
        // 判断状态
        if(_this.PromiseState !== 'pending') return;
         // 1.修改状态 promiseState
         _this.PromiseState = 'rejected';
         // 2.设置对象的值 promiseResult
         _this.PromiseResult = data;
        //  执行回调
        _this.callbacks.forEach(item=>{
            item.onRejected(data)
        })
    }
    // 执行器函数在内部是同步调用的
    try{
        executor(resolve,reject);
    }catch(e){
        reject(e)
    }
}
// 添加 then 方法
Promise.prototype.then = function(onResolved,onRejected){
    return new Promise((resolve,reject)=>{
        if(this.PromiseState === 'fulfilled'){
            try{
            // 获取回调函数的执行结果
            let result = onResolved(this.PromiseResult)
            // 判断
            if(result instanceof Promise){
                // 如果是Promise对象
                result.then(v=>{
                    resolve(v)
                },r=>{
                    reject(r)
                })
            }else{
                // 结果的对象状态为成功
                resolve(result)
            }
        }catch(e){
            reject(e)
        }
            // onResolved(this.PromiseState);
        }
        if(this.PromiseState === 'rejected'){
            onRejected(this.PromiseState);
        }
        if(this.PromiseState === 'pending'){
            // 保存回调函数
            this.callbacks.push({
                onResolved:onResolved,
                onRejected:onRejected
            })
        }     
    })
}